# -*- coding: utf-8 -*-
"""
作者: liuzaiqiang
邮箱: zaiqiangliu@163.com
地址: 新疆大学
创建时间: 2025/11/17 18:54
功能描述: 
"""
"""
题目背景：

    研究生经常需要处理和备份大量的实验数据。假设你的云存储空间有限，你希望优先备份那些最重要且单位大小价值最高的数据文件，以在有限的空间内最大化备份数据的总价值。

题目描述：

    你有一系列数据文件，每个文件都有一个“大小(weight)”和一个“重要性评分(value)”。你的任务是设计一个 DataBackup 系统，
    该系统能够选择要备份的文件（或文件的一部分），以在不超过云盘总容量的前提下，最大化备份的总价值。

需要：

    1.创建一个 DataFile 类来表示数据文件，包含 name, size, value 属性。
    2.创建一个 DataBackup 类，包含 capacity 属性和一个 perform_backup 方法。
    3.perform_backup 方法接收一个文件列表，并根据贪心策略（优先选择“价值密度”最高的文件）来决定备份方案，并返回最大总价值。

测试用例：

输入	输出
50	240.00
0	0.00
100	325.00


"""
class DataFile:
    def __init__(self, name, size, value):
        self.name = name
        self.size = size
        self.value = value
        if size == 0:
            self.value_density = 0
        else:
            self.value_density = value / size  #暂时不考虑除0异常

class DataBackup:
    def __init__(self, capacity):
        #同一个实例多次调用DataBackup方法时，容量会被累积修改。
        #但是如果每次都是新创建一个DataBackup实例，则不会有这个问题
        self.capacity = capacity


    def perform_backup(self, files):
        # 最好：capacity作为实例的初始属性，理应保持不变（代表备份设备的总容量），而方法中应使用临时变量（且最好应该是局部变量！）记录 “剩余容量”，更符合代码的语义设计。
        capacityLeft = self.capacity
        # 对一批文件根据价值密度 降序排序
        files.sort(key=lambda x: x.value_density, reverse=True)
        total_value = 0
        for file in files:
            if capacityLeft >= file.size:
                total_value += file.value
                capacityLeft -= file.size
            else:
                total_value += capacityLeft * file.value_density
                break
        return total_value



if __name__ == "__main__":
    capacity = 50
    files = [DataFile("file1", 10, 1000),
             DataFile("file2", 20, 2000),
             DataFile("file3", 30, 150)]
    backup = DataBackup(capacity)
    print("测试1:",round(backup.perform_backup(files),2))

    capacity = 40
    files = [DataFile("file1", 10, 1000),
             DataFile("file2", 20, 2000),
             DataFile("file3", 30, 150)]
    backup = DataBackup(capacity)
    print("测试2:",round(backup.perform_backup(files),2))



